package com.sophossystems.client.asmon.dao.spring;

import java.sql.SQLException;
import java.util.List;

import com.sophossystems.client.asmon.dao.CoordinadorDao;
import com.sophossystems.client.asmon.dto.CoordinadorDTO;
import com.sophossystems.client.asmon.exceptions.DaoException;

import org.apache.log4j.Logger;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Query;
import org.hibernate.transform.Transformers;
import org.springframework.orm.hibernate3.HibernateCallback;

public class CoordinadorDaoImpl extends AbstractDAO implements CoordinadorDao {

	private static Logger logger = Logger.getLogger(CoordinadorDaoImpl.class);
	
	@Override
	public CoordinadorDTO findByPrimaryKey(final int idCoordinador)
			throws DaoException {
		CoordinadorDTO coordinador = null;
		try {
			coordinador = (CoordinadorDTO) getHibernateTemplate().execute(
					new HibernateCallback() {
						
						@Override
						public Object doInHibernate(Session session) throws HibernateException,
								SQLException {
							final Query oQuery = session.createQuery(
									"SELECT c.idCoordinador as idCoordinador, c.idUser as idUser," +
									" c.nombre as nombre, c.tipo as tipo FROM " 
											+ getTableName() +
											" c WHERE c.idCoordinador = :id");
							oQuery.setInteger("id", idCoordinador);
							CoordinadorDTO coordinadorDto = (CoordinadorDTO) oQuery
									.setResultTransformer(Transformers.
											aliasToBean(CoordinadorDTO.class)).list().get(0);
							return coordinadorDto;
						}
					});
		} catch (final Exception e) {

			logger.error("Error: getCoordinador, cause: " + e.getMessage(), e);
			throw new DaoException("Error: getCoordinador, cause: "
					+ e.getMessage());
		}
		return coordinador;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<CoordinadorDTO> findAll() throws DaoException {
		List<CoordinadorDTO> coordinador = null;
		try {
			coordinador = (List<CoordinadorDTO>) getHibernateTemplate().executeFind(
					new HibernateCallback() {
						
						@Override
						public Object doInHibernate(Session session) throws HibernateException,
								SQLException {
							final Query oQuery = session.createQuery(
									"SELECT c.idCoordinador as idCoordinador, c.idUser as idUser," +
											" c.nombre as nombre, c.tipo as tipo FROM " 
													+ getTableName() +
													" c ORDER BY c.idCoordinador");
							List<CoordinadorDTO> coordinadorDto = oQuery.setResultTransformer(
									Transformers.aliasToBean(CoordinadorDTO.class)).list();
							return coordinadorDto;
						}
					});
		} catch (final Exception e) {
			logger.error("Error: getCoordinador, cause: " + e.getMessage(), e);
			throw new DaoException("Error: getCoordinador, cause: "
					+ e.getMessage());
		}
		return coordinador;
	}

	public String getTableName() {
		return "Coordinador";
	}
}
